home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / qlib205.zip / QLIB.ZIP / SRC / QLIB / CALLBACK.ASM < prev    next >
Assembly Source File  |  1997-07-08  |  2KB  |  92 lines

  1. include qlib.inc
  2.  
  3. .code
  4.  
  5. ;FIX! : v2.02 : these funcs were totaly fixed (they didn't work at all before)
  6.  
  7. ;calls your PMODE function when seg:off (which is returned from here)
  8. ; is run by something (just set a RM int to what is returned)
  9. ; note: your proc must end with 'retf'
  10. ;out:
  11. ; ax:dx = RM seg:off to call
  12. callback_alloc proc,off:dword,calls:dword,typ:byte
  13.   ;typ: 0=retf 1-iret  (this is ignored by PMODE/W)
  14.   ;off = your procedure
  15.   pushad
  16.   mov ax,303h
  17.   mov esi,off  ;your PROC
  18.   mov edi,calls ;callstruct you must provide
  19.   int 31h
  20.   .if carry?
  21.     popad
  22.     mov eax,ERROR
  23.   .else
  24.     movzx ecx,cx
  25.     movzx edx,dx
  26.     mov [esp+7*4],ecx  ;eax
  27.     mov [esp+5*4],edx  ;edx
  28.     popad
  29.   .endif
  30.   ret
  31. callback_alloc endp
  32.  
  33. callback_free proc,a:word,d:word  ;a:d = ax:dx that was returned from alloc_realmode
  34.   pushad
  35.   mov ax,304h
  36.   mov cx,a
  37.   mov dx,d
  38.   int 31h
  39.   popad
  40.   .if carry?
  41.     mov eax,ERROR
  42.   .else
  43.     xor eax,eax
  44.   .endif
  45.   ret
  46. callback_free endp
  47.  
  48. ; call this at the end of your PROC that was called by a callback
  49. ; this function does not return!
  50. ; don't worry about stack clean up or anything  just call this and that's it
  51. ;use this one if the RMODE CS:IP was called FAR
  52. _retf proc,calls:dword     ;calls= callstruct
  53.   mov edi,calls
  54.   xor eax,eax
  55.   mov ax,es:[edi].callstruct._ss
  56.   shl eax,4
  57.   xor ebx,ebx
  58.   add bx,es:[edi].callstruct._sp
  59.   add eax,ebx
  60.   mov bx,[eax]
  61.   mov es:[edi].callstruct._ip,bx
  62.   mov bx,[eax+2]
  63.   mov es:[edi].callstruct._cs,bx
  64.   add es:[edi].callstruct._sp,4
  65.   iretd
  66. _retf endp
  67.  
  68. ; call this at the end of your PROC that was called by a callback
  69. ; this function does not return!
  70. ; don't worry about stack clean up or anything  just call this and that's it
  71. ;use this one if the RMODE CS:IP was called as an INT handler
  72. _iret proc,calls:dword
  73.   mov edi,calls
  74.   xor eax,eax
  75.   mov ax,es:[edi].callstruct._ss
  76.   shl eax,4
  77.   xor ebx,ebx
  78.   add bx,es:[edi].callstruct._sp
  79.   add eax,ebx
  80.   mov bx,[eax]
  81.   mov es:[edi].callstruct._ip,bx
  82.   mov bx,[eax+2]
  83.   mov es:[edi].callstruct._cs,bx
  84.   mov bx,[eax+4]
  85.   mov es:[edi].callstruct._flg,bx
  86.   add es:[edi].callstruct._sp,6
  87.   iretd
  88. _iret endp
  89.  
  90. end
  91.  
  92.